Kubernetes API Server的核心功能是提供了Kubernetes各类资源对象(如Pod,RC, Service等)的增、删、改、查及Watch等HTTP Rest接口,接受外部请求,并将信息写到ETCD中,成为集群内各个功能模块之间数据交互和通信的中心枢纽,是整个系统的数据总线和数据中心。除此之外,它还有以下一些功能特性。
(1)是集群管理的API入口。
(2)是资源配额控制的入口。
(3)提供了完备的集群安全机制。
理论概述
Kubernetes API Server通过一个名为kube-apiserver的进程提供服务,该进程运行在Master节点上,如果小伙伴使用二进制方式安装k8s,会发现,kube-apiserver是docker之后第一个要启动的服务
v1=client.CoreV1Api() print("Listing pods with their IPs:") ret = v1.list_pod_for_all_namespaces(watch=False) for i in ret.items: print("%s\t%s\t%s" % (i.status.pod_ip, i.metadata.namespace, i.metadata.name))
/** * A simple example of how to use the Java API from an application outside a kubernetes cluster * * <p>Easiest way to run this: mvn exec:java * -Dexec.mainClass="io.kubernetes.client.examples.KubeConfigFileClientExample" * * <p>From inside $REPO_DIR/examples */ publicclassKubeConfigFileClientExample{ publicstaticvoidmain(String[] args)throws IOException, ApiException {
// file path to your KubeConfig String kubeConfigPath = "D:\\code\\k8s\\java\\examples\\examples-release-10\\src\\main\\java\\io\\kubernetes\\client\\examples\\config";
// loading the out-of-cluster config, a kubeconfig from file-system ApiClient client = ClientBuilder.kubeconfig(KubeConfig.loadKubeConfig(new FileReader(kubeConfigPath))).build();
// set the global default api-client to the in-cluster one from above Configuration.setDefaultApiClient(client);
// the CoreV1Api loads default api-client from global configuration. CoreV1Api api = new CoreV1Api();
// invokes the CoreV1Api client V1PodList list = api.listPodForAllNamespaces(null, null, null, null, null, null, null, null, null); for (V1Pod item : list.getItems()) { System.out.println(item.getMetadata().getName()); } } }
输出所有pod
1 2 3 4 5 6 7 8 9 10 11 12 13 14
D:\Java\jdk1.8.0_251\bin\java.exe 。。。 SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder". SLF4J: Defaulting to no-operation (NOP) logger implementation SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details. Bad level value for property: .level Bad level value for property: java.util.logging.ConsoleHandler.level calico-kube-controllers-78d6f96c7b-85rv9 calico-node-6nfqv calico-node-fv458 calico-node-h5lsq coredns-7f6cbbb7b8-ncd2s coredns-7f6cbbb7b8-pjnct etcd-vms81.liruilongs.github.io 。。。。。。。。。
独特的Kubernetes Proxy API接口
Kubernetes Proxy API接口,作用是代理REST请求,即Kubernetes API Server把收到的REST请求转发到某个Node上的kubelet·守护进程的REST端口上,由该kubelet进程负责响应。
1 2 3 4 5 6 7 8 9 10 11 12
┌──[root@vms81.liruilongs.github.io]-[~] └─$kubectl proxy 8080 & [1] 76543 ┌──[root@vms81.liruilongs.github.io]-[~] └─$Starting to serve on 127.0.0.1:8001 ┌──[root@vms81.liruilongs.github.io]-[~] └─$kubectl get nodes NAME STATUS ROLES AGE VERSION vms81.liruilongs.github.io Ready control-plane,master 4d v1.22.2 vms82.liruilongs.github.io Ready <none> 4d v1.22.2 vms83.liruilongs.github.io NotReady <none> 4d v1.22.2
Kubernetes API Server 作为集群的核心,负责集群各功能模块之间的通信。集群内的各个功能模块通过API Server将信息存入etcd,当需要获取和操作这些数据时,则通过API Server提供的REST接口(用GET, LIST或WATCH方法)来实现,从而实现各模块之间的信息交互。
交互场景:
kubelet进程与API Server的交互每个Node节点上的kubelet每隔一个时间周期,就会调用一次API Server的REST接口报告自身状态, API Server接收到这些信息后,将节点状态信息更新到etcd中。 , kubelet也通过API Server的Watch接口监听Pod信息,如果监听到新的Pod副本被调度绑定到本节点,则执行Pod对应的容器的创建和启动逻辑;如果监听到Pod对象被删除,则删除本节点上的相应的Pod容器;如果监听到修改Pod信息,则kubelet监听到变化后,会相应地修改本节点的Pod容器。